<template>
  <div class="inner-box bold btn" @click="onClickData">
    商品数据
  </div>
</template>

<script setup lang="ts">
import { ref, getCurrentInstance } from 'vue';
import {message} from 'ant-design-vue'
import {isLogin} from '~/logic'
import {TRequest} from "~/utils/ali/PCRequest";
import { $itemType } from './index'
import { batch } from '~/logic/apis/taoCategory'
import {utils, writeFileXLSX} from 'xlsx'
const emit = defineEmits(['login'])
const __option = getCurrentInstance()?.appContext.provides.option;

const getItem = () => {
  const instance = getCurrentInstance();
  const item = (instance?.proxy as { $item?: any }).$item ?? {};
  return item;
}
const item = getItem()
const dataObj = ref({
  "店铺名称":'-',
  "店铺类型":'-',
  "商品标题":'-',
  "商品ID":'-',
  "类目":'-',
  "上架时间":'-',
  "SKU数量": 0,
  "已售":'-',
  "销售额约":'-',
  "收藏":'-',
  "评价":'-',
  "问大家":'-',
  "付款":'-',
})
const xlsxName = ref('default.xlsx')
/**
 * 异步获取商品类目信息
 * 这个函数首先获取商品的类目 ID，然后使用这个 ID 发起一个异步请求获取类目数据
 * 如果请求成功，并且类目数据存在，函数将类目数据路径进行拼接并返回
 * 如果请求失败或者类目数据不存在，函数将返回一个短划线 `-`，表示没有类目信息
 * @returns {Promise<string>} 包含类目路径的字符串或者 `-`，表示没有类目信息
 */
const getClass = async() => {
  const id = item.cid()
  const res: any = await batch([id])
  if (res.data.data) {
    const path = res.data.data[id].path
    return path.join('/')
  } else {
    return '-'
  }
}
/**
 * 获取数据的异步函数，用于获取商品详情、销售数据、上下架时间等信息，并对数据进行格式化和整理
 * 如果用户已登录，此函数会执行以下操作：
 * 1. 获取商品详情并等待响应
 * 2. 提取详情中的店铺 ID、卖家 ID、商品 ID 等信息
 * 3. 根据提取的 ID 获取上下架时间数据并等待响应
 * 4. 获取商品类目信息
 * 5. 整理和格式化数据，生成一个包含店铺名、类目、标题、ID、上下架时间、SKU 数量、销售数据、售价、点赞数、评论数、提问数和付款数的对象
 * 6. 将格式化后的数据存储在 dataObj.value 中
 * 7. 将 dataObj.value 的内容输出到控制台
 * 8. 调用 exportExcel 函数
 * @param {Object} param.emit - 一个 Vue 对象的 emit 方法
 * @param {Object} param.__option - 一个对象，包含用户登录信息
 */
const getData = async() => {
  if (isLogin({emit}, __option)) {
    const res1: $itemType = await  item.getDetail()
    const res2 = await TRequest.pcTmDetail(item.itemId())
    const timeData = {
      shopId: res1.seller.shopId,
      sellerId: res1.seller.userId,
      itemId: res1.item.itemId,
    }
    const res3 = await TRequest.getputawayTime(timeData)
    const res4 = await getClass()
    dataObj.value = {
      "店铺名称": res1.seller.shopName,
      "店铺类型": res1.seller.shopType,
      "商品标题": res1.item.title,
      "商品ID": res1.item.itemId,
      "类目": res4,
      "上架时间": res3.data[res1.item.itemId],
      "SKU数量": res1.skuBase.skus.length,
      "已售": res2.item.vagueSellCount,
      "销售额约": formatNumberString(res2.item.vagueSellCount,res2.skuCore.sku2info[0].price.priceMoney),
      "收藏": res1.item.favcount,
      "评价": res1.item.commentCount,
      "问大家": res1.vertical.askAll.questNum,
      "付款": res1.rate.totalCount,
    }
    console.log("🚀 ~ getData ~ dataObj.value:", dataObj.value)
    xlsxName.value = `商品数据ID_${res1.item.itemId}_${res3.data[res1.item.itemId]}.xlsx`
    exportExcel()
  }
}
/**
 * 将数据对象导出为 Excel 文件
 * 这个函数将输入的对象转换为工作表，创建一个新的工作簿，将工作表添加到工作簿，然后将工作簿写入一个 Excel 文件。最终的 Excel 文件将有一个名为"Sheet1"的工作表。
 */
const exportExcel = () => {
  // 将 JSON 数据转换为工作表格式
  const ws = utils.json_to_sheet([dataObj.value]);
  // 创建一个新的工作簿
  const wb = utils.book_new();
  // 将工作表添加到工作簿中
  utils.book_append_sheet(wb, ws, 'Sheet1');
  // 导出 Excel 文件
  writeFileXLSX(wb, xlsxName.value);
}

/**
 * 将带有数字和单位的字符串格式化为指定的数值，并可以根据需要乘以一个乘数。如果格式不正确会报错。
 *  @param input 要格式化的字符串
 *  @param multiplier 乘数
 *  @return 格式化后的字符串
 */
const formatNumberString = (input: string, multiplier: number): string => {
  if (!input || !multiplier) return ''
  const str = input.toString().split('+').shift();
  if (!str) return ''
  // 预定义单位映射
  const unitMap: { [key: string]: number }= {
    '万': 10000,
    '千': 1000,
    '百': 100,
    '十': 10,
    '': 1  // 没有单位时
  };
  const regex = /^([\d.]+)(万|千|百|十|件|个|XXX|\+)?$/;
  const match = str.match(regex);
  if (!match) {
    throw new Error('输入格式不正确');
  }
  let numberPart = parseFloat(match[1]);
  const unitPart = match[2] || '';  // 可能没有单位
  // 将单位转换为对应的数值
  const unitValue = unitMap[unitPart] || 1;
  numberPart *= (unitValue * multiplier) / 100;
  let formattedNumber;
  if (numberPart >= 10000) {
    formattedNumber = (numberPart / 10000).toFixed(2) + '万';
  } else {
    formattedNumber = numberPart.toFixed(2);
  }
  return formattedNumber;
}

const onClickData = () => {
  getData()
  console.log('点击下载');
  
}
</script>

<style lang="scss" scoped>

</style>